﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

namespace TemplateDemo.Common
{
    public class CommonHelper
    {

        /// <summary>
        /// 验证手机号
        /// </summary>
        /// <param name="str_handset"></param>
        /// <returns></returns>
        public static bool IsPhoneNumber(string phone)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(phone, @"^1[3456789]\d{9}$");
        }
        /// <summary>
        /// 验证邮箱
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        public static bool IsEmail(string email)
        {
            return System.Text.RegularExpressions.Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
        }
        /// <summary>
        /// 根据生日获取年龄
        /// </summary>
        /// <param name="Birthdate"></param>
        /// <returns></returns>
        public static string GetAgeByBirth(string Birthdate)
        {
            string ages = string.Empty;
            try
            {
                //年龄格式化
                DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
                dtFormat.ShortDatePattern = "yyyy-MM-dd";
                DateTime dt = Convert.ToDateTime(Birthdate, dtFormat);
                int age = DateTime.Now.Year - dt.Year;
                if (DateTime.Now.Month < dt.Month || (DateTime.Now.Month == dt.Month && DateTime.Now.Day < dt.Day)) age--;
                TimeSpan ts = DateTime.Now - dt;
                ages = age == 0 ? "-" + ts.Days : age.ToString();
            }
            catch (Exception ex)
            {

            }

            return ages;
        }
        /// <summary>
        /// 是否是身份证
        /// </summary>
        /// <param name="idNumber"></param>
        /// <returns></returns>
        public static bool IsIdNumber(string idNumber)
        {
            if (idNumber.Length == 18)
                return CheckIDCard18(idNumber);
            else if (idNumber.Length == 15)
                return CheckIDCard15(idNumber);
            else
                return false;
        }
        /// <summary>  
        /// 18位身份证号码验证  
        /// </summary>  
        private static bool CheckIDCard18(string idNumber)
        {
            long n = 0;
            if (long.TryParse(idNumber.Remove(17), out n) == false
                || n < Math.Pow(10, 16) || long.TryParse(idNumber.Replace('x', '0').Replace('X', '0'), out n) == false)
            {
                return false;//数字验证  
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if (address.IndexOf(idNumber.Remove(2)) == -1)
            {
                return false;//省份验证  
            }
            string birth = idNumber.Substring(6, 8).Insert(6, "-").Insert(4, "-");
            DateTime time = new DateTime();
            if (DateTime.TryParse(birth, out time) == false)
            {
                return false;//生日验证  
            }
            string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
            string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
            char[] Ai = idNumber.Remove(17).ToCharArray();
            int sum = 0;
            for (int i = 0; i < 17; i++)
            {
                sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
            }
            int y = -1;
            Math.DivRem(sum, 11, out y);
            if (arrVarifyCode[y] != idNumber.Substring(17, 1).ToLower())
            {
                return false;//校验码验证  
            }
            return true;//符合GB11643-1999标准  
        }

        /// <summary>
        /// 根据身份证号取得生日
        /// </summary>
        /// <param name="idNumber"></param>
        /// <returns></returns>
        public static DateTime GetBirthDayFromIdNumber(string idNumber)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(idNumber) || !IsIdNumber(idNumber))
                {
                    return DateTime.MinValue;
                }
                switch (idNumber.Length)
                {
                    case 18:
                        {
                            var birthday = string.Format("{0}/{1}/{2}",
                            idNumber.Substring(6, 4),
                            idNumber.Substring(10, 2),
                            idNumber.Substring(12, 2)
                            );
                            return DateTime.Parse(birthday);
                        }
                    case 15:
                        {

                            var birthday = string.Format("19{0}/{1}/{2}",
                        idNumber.Substring(7, 2),
                        idNumber.Substring(8, 2),
                        idNumber.Substring(10, 2)
                        );
                            return DateTime.Parse(birthday);
                        }
                }
            }
            catch (Exception)
            {

            }
            return DateTime.MinValue;
        }
        /// <summary>
        /// 根据身份证判断是否为男性
        /// </summary>
        /// <param name="idNumber"></param>
        /// <returns></returns>
        public static bool IdNumberIsMale(string idNumber)
        {
            int result = 0;
            if (IsIdNumber(idNumber))
            {
                switch (idNumber.Length)
                {
                    case 18:
                        {
                            //倒数第二位判断性别  奇数为男
                            int.TryParse(idNumber.Substring(16, 1), out result);
                            break;
                        }
                    case 15:
                        {
                            //倒数第一位判断性别 奇数为男
                            int.TryParse(idNumber.Substring(14, 1), out result);
                            break;
                        }
                }
            }
            return Convert.ToBoolean(result % 2);
        }

        private static bool CheckIDCard15(string idNumber)
        {
            long n = 0;
            if (long.TryParse(idNumber, out n) == false || n < Math.Pow(10, 14))
            {
                return false;//数字验证  
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if (address.IndexOf(idNumber.Remove(2)) == -1)
            {
                return false;//省份验证  
            }
            string birth = idNumber.Substring(6, 6).Insert(4, "-").Insert(2, "-");
            System.DateTime time = new System.DateTime();
            if (System.DateTime.TryParse(birth, out time) == false)
            {
                return false;//生日验证  
            }
            return true;
        }

        public static string GenerateCode(int Length, bool Sleep)
        {
            if (Sleep) System.Threading.Thread.Sleep(3);
            char[] Pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
            string result = "";
            int n = Pattern.Length;
            System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
            for (int i = 0; i < Length; i++)
            {
                int rnd = random.Next(0, n);
                result += Pattern[rnd];
            }
            return result;
        }
    }
}
